﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace SemiCASE.UserControls
{
    public partial class TarihTextBoxIkili : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DogrulamaAyarla();
                KontrolunEnableDurumunuAyarla(uciAktif);
            }
        }


        #region "Properties"

        public bool Visible
        {
            get { return ViewState["uciVisible"] == null ? true : (bool)ViewState["uciVisible"]; }
            set { ViewState["uciVisible"] = value; KontrolVisibleAyari(value); }
        }

        /// <summary>
        /// Bu parametreye bir ValidationGroup verildiğinde zorunluluk ve aralık (range) kontrolü yapılacak demektir
        /// </summary>
        public string uciDogrulamaGrubu
        {
            get { return ViewState["uciDogrulamaGrubu"] == null ? String.Empty : (string)ViewState["uciDogrulamaGrubu"]; }
            set { ViewState["uciDogrulamaGrubu"] = value; DogrulamaAyarla(); }
        }

        public bool uciAktif
        {
            get { return ViewState["uciAktif"] == null ? true : (bool)ViewState["uciAktif"]; }
            set { ViewState["uciAktif"] = value; KontrolunEnableDurumunuAyarla(value); }
        }

        /// <summary>
        /// Girilebilecek minimum yıl değeridir. uciAktif olabilmesi için uciDogrulamaGrubu parametresine değer verilmelidir.
        /// </summary>
        public int uciTarihAraligiMinimumYil
        {
            get { return ViewState["uciTarihAraligiMinimumYil"] == null ? DateTime.MinValue.Year : (int)ViewState["uciTarihAraligiMinimumYil"]; }
            set { ViewState["uciTarihAraligiMinimumYil"] = value; HiddenFieldMinimumYil.Value = value.ToString(); }
        }

        /// <summary>
        /// Girilebilecek maksimum yıl değeridir. uciAktif olabilmesi için uciDogrulamaGrubu parametresine değer verilmelidir.
        /// </summary>
        public int uciTarihAraligiMaksimumYil
        {
            get { return ViewState["uciTarihAraligiMaksimumYil"] == null ? DateTime.MaxValue.Year : (int)ViewState["uciTarihAraligiMaksimumYil"]; }
            set { ViewState["uciTarihAraligiMaksimumYil"] = value; HiddenFieldMaksimumYil.Value = value.ToString(); }
        }

        public DateTime uciMinumumTarih
        {
            get { return ViewState["uciMinumumTarih"] == null ? DateTime.MinValue : (DateTime)ViewState["uciMinumumTarih"]; }
            set { ViewState["uciMinumumTarih"] = value; MinumumTarihKaydet(value); }
        }
        public DateTime uciMaksimumTarih
        {
            get { return ViewState["uciMaksimumTarih"] == null ? DateTime.MaxValue : (DateTime)ViewState["uciMaksimumTarih"]; }
            set { ViewState["uciMaksimumTarih"] = value; MaksimumTarihKaydet(value); }
        }

        public bool uciZorunlu
        {
            get { return ViewState["uciZorunlu"] == null ? false : (bool)ViewState["uciZorunlu"]; }
            set { ViewState["uciZorunlu"] = value; DogrulamaAyarla(); }
        }
        public bool uciSaltOkunur
        {
            get { return ViewState["uciSaltOkunur"] == null ? false : (bool)ViewState["uciSaltOkunur"]; }
            set { ViewState["uciSaltOkunur"] = value; KontrolunReadOnlyDurumunuAyarla(value); }
        }

        #endregion

        private void KontrolVisibleAyari(bool pVisible)
        {
            HtmlControl tablo = (HtmlControl)this.FindControl("TabloTarihIkili");
            if (pVisible)
            {
                tablo.Style.Add("display", "block");
            }
            else
            {
                tablo.Style.Add("display", "none");
            }
        }

        private void MinumumTarihKaydet(DateTime pMinTar)
        {
            HiddenFieldMinTarYil.Value = pMinTar.Year.ToString();
            HiddenFieldMinTarAy.Value = pMinTar.Month.ToString();
            HiddenFieldMinTarGun.Value = pMinTar.Day.ToString();
        }
        private void MaksimumTarihKaydet(DateTime pMaksTar)
        {
            HiddenFieldMaksTarYil.Value = pMaksTar.Year.ToString();
            HiddenFieldMaksTarAy.Value = pMaksTar.Month.ToString();
            HiddenFieldMaksTarGun.Value = pMaksTar.Day.ToString();
        }

        private void KontrolunEnableDurumunuAyarla(bool value)
        {
            TextBoxGun1.Enabled = value;
            TextBoxAy1.Enabled = value;
            TextBoxYil1.Enabled = value;
            ImageButtonTakvim1.Enabled = value;
            ImageTemizle1.Enabled = value;

            TextBoxGun2.Enabled = value;
            TextBoxAy2.Enabled = value;
            TextBoxYil2.Enabled = value;
            ImageButtonTakvim2.Enabled = value;
            ImageTemizle2.Enabled = value;
        }
        private void KontrolunReadOnlyDurumunuAyarla(bool value)
        {
            TextBoxGun1.Enabled = !value;
            TextBoxAy1.Enabled = !value;
            TextBoxYil1.Enabled = !value;

            TextBoxGun2.Enabled = !value;
            TextBoxAy2.Enabled = !value;
            TextBoxYil2.Enabled = !value;
        }

        private void DogrulamaAyarla()
        {
            if (uciDogrulamaGrubu != String.Empty)
            {
                Dogrulama.MyCompareValidator(CompareValidatorTarih, ValidationCompareOperator.GreaterThanEqual, ValidationDataType.Date, "Bitiş Tarihi", "Başlangıç Tarihi", uciDogrulamaGrubu, "TextBoxTar2", "TextBoxTar1");
                CompareValidatorTarih.Text = "!";
                CompareValidatorTarih.ToolTip = CompareValidatorTarih.ErrorMessage;

                if (uciZorunlu)
                {
                    #region "Tarih 1"
                    Dogrulama.MyRequiredFieldValidator(RequiredFieldValidatorGun1, uciDogrulamaGrubu, "TextBoxGun1");
                    RequiredFieldValidatorGun1.Text = "!";
                    RequiredFieldValidatorGun1.ErrorMessage = "Gün giriniz !";
                    RequiredFieldValidatorGun1.ToolTip = RequiredFieldValidatorGun1.ErrorMessage;

                    Dogrulama.MyRequiredFieldValidator(RequiredFieldValidatorAy1, uciDogrulamaGrubu, "TextBoxAy1");
                    RequiredFieldValidatorAy1.Text = "!";
                    RequiredFieldValidatorAy1.ErrorMessage = "Ay giriniz !";
                    RequiredFieldValidatorAy1.ToolTip = RequiredFieldValidatorAy1.ErrorMessage;

                    Dogrulama.MyRequiredFieldValidator(RequiredFieldValidatorYil1, uciDogrulamaGrubu, "TextBoxYil1");
                    RequiredFieldValidatorYil1.Text = "!";
                    RequiredFieldValidatorYil1.ErrorMessage = "Yıl giriniz !";
                    RequiredFieldValidatorYil1.ToolTip = RequiredFieldValidatorYil1.ErrorMessage;

                    #endregion

                    #region "Tarih 2"
                    Dogrulama.MyRequiredFieldValidator(RequiredFieldValidatorGun2, uciDogrulamaGrubu, "TextBoxGun2");
                    RequiredFieldValidatorGun2.Text = "!";
                    RequiredFieldValidatorGun2.ErrorMessage = "Gün giriniz !";
                    RequiredFieldValidatorGun2.ToolTip = RequiredFieldValidatorGun2.ErrorMessage;

                    Dogrulama.MyRequiredFieldValidator(RequiredFieldValidatorAy2, uciDogrulamaGrubu, "TextBoxAy2");
                    RequiredFieldValidatorAy2.Text = "!";
                    RequiredFieldValidatorAy2.ErrorMessage = "Ay giriniz !";
                    RequiredFieldValidatorAy2.ToolTip = RequiredFieldValidatorAy2.ErrorMessage;

                    Dogrulama.MyRequiredFieldValidator(RequiredFieldValidatorYil2, uciDogrulamaGrubu, "TextBoxYil2");
                    RequiredFieldValidatorYil2.Text = "!";
                    RequiredFieldValidatorYil2.ErrorMessage = "Yıl giriniz !";
                    RequiredFieldValidatorYil2.ToolTip = RequiredFieldValidatorYil2.ErrorMessage;

                    #endregion

                    DogrulamaKontrolleriniAcKapat(true);
                }

                else
                {
                    DogrulamaKontrolleriniAcKapat(false);
                }
            }
            else
            {
                DogrulamaKontrolleriniAcKapat(false);
                CompareValidatorTarih.Visible = false;
            }
        }

        private void DogrulamaKontrolleriniAcKapat(bool pDurum)
        {
            #region "Tarih 1"
            RequiredFieldValidatorGun1.Visible = pDurum;
            RequiredFieldValidatorAy1.Visible = pDurum;
            RequiredFieldValidatorYil1.Visible = pDurum;

            #endregion

            #region "Tarih 2"
            RequiredFieldValidatorGun2.Visible = pDurum;
            RequiredFieldValidatorAy2.Visible = pDurum;
            RequiredFieldValidatorYil2.Visible = pDurum;

            #endregion
        }
        /// <summary>
        /// Girilen tarih doğru ise aynen, değilse, minimum sistem tarihi DateTime tipinde döndürülür
        /// </summary>
        public DateTime? ucoTarihBaslangicAsNullable
        {
            get
            {
                try
                {
                    int gun = int.Parse(TextBoxGun1.Text);
                    int ay = int.Parse(TextBoxAy1.Text);
                    int yil = int.Parse(TextBoxYil1.Text);

                    DateTime dt = new DateTime(yil, ay, gun);
                    return dt;
                }
                catch (Exception)
                {
                    return null; // DateTime.MinValue; eskiden Minumum sistem tarihi döndürülüyordu, ama istek üzerine değiştirildi 30.09.2009   
                }
            }
            set { if (value != null) SetDateTime1(Convert.ToDateTime(value)); else VerilenTarih1DegeriniSetle(String.Empty); }
        }
        /// <summary>
        /// Girilen tarih doğru ise aynen, değilse, minimum sistem tarihi DateTime tipinde döndürülür
        /// </summary>
        public DateTime ucoTarihBaslangic
        {
            get
            {
                try
                {
                    int gun = int.Parse(TextBoxGun1.Text);
                    int ay = int.Parse(TextBoxAy1.Text);
                    int yil = int.Parse(TextBoxYil1.Text);

                    DateTime dt = new DateTime(yil, ay, gun);
                    return dt;
                }
                catch (Exception)
                {
                    return DateTime.MinValue;
                }
            }
            set { if (value != null) SetDateTime1(Convert.ToDateTime(value)); else VerilenTarih1DegeriniSetle(String.Empty); }
        }


        /// <summary>
        /// Girilen tarih doğru ise aynen, değilse, minimum sistem tarihi DateTime tipinde döndürülür
        /// </summary>
        public DateTime ucoTarihBitis
        {
            get
            {
                try
                {
                    int gun = int.Parse(TextBoxGun2.Text);
                    int ay = int.Parse(TextBoxAy2.Text);
                    int yil = int.Parse(TextBoxYil2.Text);

                    DateTime dt = new DateTime(yil, ay, gun, 23, 59, 59);
                    return dt;
                }
                catch (Exception)
                {
                    return DateTime.MinValue;
                }
            }
            set { if (value != null) SetDateTime2(Convert.ToDateTime(value)); else VerilenTarih2DegeriniSetle(String.Empty); }
        }

        /// <summary>
        /// Girilen tarih doğru ise aynen, değilse, minimum sistem tarihi DateTime tipinde döndürülür
        /// </summary>
        public DateTime? ucoTarihBitisAsNullable
        {
            get
            {
                try
                {
                    int gun = int.Parse(TextBoxGun2.Text);
                    int ay = int.Parse(TextBoxAy2.Text);
                    int yil = int.Parse(TextBoxYil2.Text);

                    DateTime dt = new DateTime(yil, ay, gun,23,59,59);
                    return dt;
                }
                catch (Exception)
                {
                    return null; // DateTime.MinValue; eskiden Minumum sistem tarihi döndürülüyordu, ama istek üzerine değiştirildi 23.12.2009   
                }
            }
            set { if (value != null) SetDateTime2(Convert.ToDateTime(value)); else VerilenTarih2DegeriniSetle(String.Empty); }
        }

        /// <summary>
        /// Girilen tarih doğru ise aynen, değilse, minimum sistem tarihi string tipinde döndürülür
        /// </summary>
        public string ucoText1
        {
            get { return Tarih1StringOlarakDondur(); }
            set { VerilenTarih1DegeriniSetle(value); }
        }

        /// <summary>
        /// Girilen tarih doğru ise aynen, değilse, minimum sistem tarihi string tipinde döndürülür
        /// </summary>
        public string ucoText2
        {
            get { return Tarih2StringOlarakDondur(); }
            set { VerilenTarih2DegeriniSetle(value); }
        }

        private string Tarih1StringOlarakDondur()
        {
            if (String.IsNullOrEmpty(TextBoxGun1.Text) || String.IsNullOrEmpty(TextBoxAy1.Text) || String.IsNullOrEmpty(TextBoxYil1.Text))
                return String.Empty;
            else
                return string.Format("{0:dd.MM.yyyy HH:mm:ss}", ucoTarihBaslangic);
        }

        private string Tarih2StringOlarakDondur()
        {
            if (String.IsNullOrEmpty(TextBoxGun2.Text) || String.IsNullOrEmpty(TextBoxAy2.Text) || String.IsNullOrEmpty(TextBoxYil2.Text))
                return String.Empty;
            else
                return string.Format("{0:dd.MM.yyyy HH:mm:ss}", ucoTarihBitis);
        }

        private void VerilenTarih1DegeriniSetle(string pDt)
        {
            if (String.IsNullOrEmpty(pDt))
            {
                TextBoxGun1.Text = "";
                TextBoxAy1.Text = "";
                TextBoxYil1.Text = "";
                TextBoxTar1.Text = "";
            }
            else
            {
                if (TipDogrulama.IsDate(pDt)) SetDateTime1(Convert.ToDateTime(pDt));
            }
        }

        private void SetDateTime1(DateTime pDt)
        {
            TextBoxGun1.Text = (String.Format("{0:00}", pDt.Day)).ToString();
            TextBoxAy1.Text = (String.Format("{0:00}", pDt.Month)).ToString();
            TextBoxYil1.Text = pDt.Year.ToString();
            TextBoxTar1.Text = string.Format("{0:dd.MM.yyyy}", pDt);
        }

        private void VerilenTarih2DegeriniSetle(string pDt)
        {
            if (String.IsNullOrEmpty(pDt))
            {
                TextBoxGun2.Text = "";
                TextBoxAy2.Text = "";
                TextBoxYil2.Text = "";
                TextBoxTar2.Text = "";
            }
            else
            {
                if (TipDogrulama.IsDate(pDt)) SetDateTime2(Convert.ToDateTime(pDt));
            }
        }

        private void SetDateTime2(DateTime pDt)
        {
            TextBoxGun2.Text = (String.Format("{0:00}", pDt.Day)).ToString();
            TextBoxAy2.Text = (String.Format("{0:00}", pDt.Month)).ToString();
            TextBoxYil2.Text = pDt.Year.ToString();
            TextBoxTar2.Text = string.Format("{0:dd.MM.yyyy}", pDt);
        }
    }

}
